/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tcr.main;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.tcr.main.R;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;

/**
 *
 * @author V.D
 * 
 * Activity permettant l'affichage de l'interface de creation d'un nouveau client
 * On va recuperer toutes les informations nécessaires pour la création,
 * vérifier qu'il n'y a pas d'erreur comme par exemple un login ou un email deja utilisé par WS
 * Un autre WS est appele afin que le client soit cree et place en BD
 * 
 */
public class CreationClient extends Activity {

    private final String URLTCR = "http://10.0.2.2:8080/TheCityRater-war/services/utilisateurs/";
    private Button validerB;
    private Button annulerB;
    private String login;
    private String mdp;
    private String nom;
    private String prenom;
    private String mail;
    private String tel;
    private String afficherErreur;
    private TextView erreur;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.creerclient);

        // Recuperation des Boutons/TextView afin de valider le formulaire
        // Annuler la création ou afficher les erreurs rencontrees
        validerB = (Button) findViewById(R.creationC.valider);
        annulerB = (Button) findViewById(R.creationC.annuler);
        erreur = (TextView) findViewById(R.creationC.erreurText);

        // Evenement de validation des donnees de creation
        validerB.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View arg0, MotionEvent arg1) {
                switch (arg1.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        verification();

                }
                return true;
            }
        });

        // Evenement d'annulation de creation et retour sur l'activity TheCityRater
        // permettant la connexion à l'application
        annulerB.setOnTouchListener(
                new View.OnTouchListener() {

                    public boolean onTouch(View arg0, MotionEvent arg1) {
                        switch (arg1.getAction()) {
                            case MotionEvent.ACTION_DOWN:
                                startActivity(new Intent(CreationClient.this, TheCityRater.class));

                        }

                        return true;
                    }
                });

    }

    /**
     * Méthode qui va permettre de vérifier les informations que l'utilisateur a rentre
     * afin de creer son compte. Si Il n'y a aucune erreur, on va creer le client puis le renvoyer
     * sur l'activity TheCityRater
     */
    public void verification() {
        afficherErreur = "";

        // Recuperation des donnees rentrees par l'utilisateur
        login = ((EditText) findViewById(R.creationC.login)).getText().toString();
        mdp = ((EditText) findViewById(R.creationC.mdp)).getText().toString();
        nom = ((EditText) findViewById(R.creationC.nom)).getText().toString();
        prenom = ((EditText) findViewById(R.creationC.prenom)).getText().toString();
        mail = ((EditText) findViewById(R.creationC.email)).getText().toString();
        tel = ((EditText) findViewById(R.creationC.tel)).getText().toString();

        // On verifie que l'utilisateur a bien rentree toutes les donnees demandees
        if (login == null || login.equals("") || mdp == null || mdp.equals("")
                || nom == null || nom.equals("") || prenom == null || prenom.equals("")
                || mail == null || mail.equals("") || tel == null || tel.equals("")) {
            afficherErreur = "Remplissez tous les champs";

        } // Login de 5 caractres minimum 
        else if (login.length() < 5) {
            afficherErreur = "Login trop court (5min)";
        } // On verifie que la personne a rentree des chiffres/Caractere pour son login 
        else if (!login.matches("[a-z0-9]*")) {
            afficherErreur = "Pas de caractère spécial pour le login";
        } // Mdp de 5 caracteres min
        else if (mdp.length()
                < 5) {
            afficherErreur = "Mot de passe trop court (5min)";
        } // On verifie que la personne a rentree des chiffres/Caractere pour son mdp 
        else if (!mdp.matches(
                "[a-z0-9]*")) {
            afficherErreur = "Pas de caractère spécial pour le password";
        }// Nom de 5 caracteres min 
        else if (nom.length()
                < 5) {
            afficherErreur = "Nom trop court (5min)";
        } // Que des lettres pour le nom 
        else if (!nom.matches(
                "[a-zA-Z]*")) {
            afficherErreur = "Nom incorrect";
        } // Prenom de caracteres min
        else if (prenom.length()
                < 3) {
            afficherErreur = " Prénom trop court (3min)";
        } // Que des lettres pour le prenom  
        else if (!prenom.matches(
                "[a-zA-Z]*")) {
            afficherErreur = "Prénom incorrect";
        } // verification de la structure de l'adresse mail 
        else if (!mail.matches(
                "^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\\.[a-z]{2,4}$")) {
            afficherErreur = "Mail incorrect";
        } // Que des chiffres pour le tel 
        else if (!tel.matches(
                "^[0-9]{10}$")) {
            afficherErreur = "Téléphone incorrect (10chiffres)";
        } else {
            userExiste(login, mail);
        }


        // On verifie qu'il n'y a pas d'erreur a afficher
        if (!afficherErreur.equals("")) {
            erreur.setText(afficherErreur);
            erreur.setVisibility(TextView.VISIBLE);
        } else {

            // Si pas d'erreur, creation de cient et retour sur l'activity TheCityRater
            if (creerClient()) {
                erreur.setVisibility(TextView.INVISIBLE);
                new AlertDialog.Builder(this).setTitle("Succés").setMessage("Votre compte a été crée, vous pouvez maintenant vous logger.").setPositiveButton("OK", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        startActivity(new Intent(CreationClient.this, TheCityRater.class));
                    }
                }).show();
            } else {
                erreur.setText(afficherErreur);
                erreur.setVisibility(TextView.VISIBLE);
            }
        }
    }

    /**
     * On verifie qu'aucun utilisateur deja enregistre ne possede
     * le nom ou le mail choisie
     * 
     * @param login
     * @param mail 
     */
    public void userExiste(String login, String mail) {
        try {

            HttpClient httpClient = new DefaultHttpClient();

            HttpGet httpGet = new HttpGet(URLTCR + login);

            HttpResponse response;

            response = httpClient.execute(httpGet);

            HttpEntity entity = response.getEntity();

            if (entity != null) {
                afficherErreur = "Login déja existant";
            } else {
                httpGet = new HttpGet(URLTCR + mail);
                response = httpClient.execute(httpGet);

                entity = response.getEntity();

                if (entity != null) {
                    afficherErreur = "Mail déja utilisé";
                }
            }
        } catch (Exception ex) {
            afficherErreur = "Serveur inaccessible";

        }
    }

    /**
     * On creer le client en BD
     * 
     * @return 
     *  true si la creation c'est bien passee
     *  false si non
     */
    public boolean creerClient() {
        try {

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(URLTCR);

            // On créer un objet JSON qui sera transmis au serveur
            JSONObject jsonObject = new JSONObject();

            jsonObject.put("LOGIN", login);
            jsonObject.put("MDP", mdp);
            jsonObject.put("NOM", nom);
            jsonObject.put("PRENOM", prenom);
            jsonObject.put("MAIL", mail);
            jsonObject.put("TELEPHONE", tel);


            // On transforme le JSON afin de pouvoir transmettre les informations
            StringEntity stringEntity = new StringEntity(jsonObject.toString());
            stringEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-Type", "application/json");
            httpPost.setEntity(stringEntity);
            HttpResponse response;

            response = httpClient.execute(httpPost);
            return true;

        } catch (Exception ex) {
            afficherErreur = "Probleme avec le serveur";
            return false;

        }
    }
}
